package spider.web;

import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;

import java.util.function.Predicate;
import java.util.HashSet;
import java.util.Set;

/**
 * @author: zhangzeli
 * @date 9:40 2018/5/5
 * <P>解析html</P>
 */
public class HtmlParserTool {

    public static Set<String> extracLinks(String url, Predicate<String> t) {
        Set<String> links = new HashSet<String>();
        try {
            Parser parser = new Parser(url);
            parser.setEncoding("UTF-8");
            NodeFilter frameFilter = (node) -> {
                if (node.getText().startsWith("frame src=")) {
                    return true;
                } else {
                    return false;
                }
            };
            //过滤a标签和frame标签
            OrFilter linkFilter = new OrFilter(new NodeClassFilter(LinkTag.class), frameFilter);
            NodeList list = parser.extractAllNodesThatMatch(linkFilter);
            for (int i = 0; i < list.size(); i++) {
                Node tag = list.elementAt(i);
                //a标签
                if (tag instanceof LinkTag) {
                    LinkTag link = (LinkTag) tag;
                    String linkUrl = link.getLink();
                    if (t.test(linkUrl)) {
                        links.add(linkUrl);
                    } else {
//                        String fram =tag.getText();
//                        int start = fram.indexOf("src=");
//                        fram =fram.substring(start-1);
//                        int end = fram.indexOf(" ");
//                        if(end==-1){
//                            end=fram.indexOf(">");
//                            String frameUrl =fram.substring(5,end-1);
//                            if(t.test(frameUrl)){
//                                links.add(frameUrl);
//                            }
//                        }
                    }
                }
            }
        } catch (ParserException e) {
            e.printStackTrace();
        }
        return links;
    }
}
